查看原文
其他

Python可视化17seborn-箱图boxplot

pythonic生物人 pythonic生物人 2022-09-11

"pythonic生物人"的第62篇分享

本文系统详解利用python中seaborn.boxplot绘制箱图boxplot。seaborn.boxplot是matplotlib.pyplot.boxplot的封装版,更个性化的设置请研究matplotlib.pyplot.boxplot

本文将了解到什么?

1、数据集准备及箱图简介2、seaborn.boxplot箱图外观设置默认参数绘制箱图 箱图异常值属性设置 异常值关闭显示 异常值marker大小设置 异常值marker形状、填充色、轮廓设置箱图上下横线属性设置 上下横线关闭 上下横线颜色、线型、线宽等设置箱图上下须线属性设置箱图箱子设置 箱子设置缺口 箱子不填充颜色 箱子外框、内部填充色 箱图中位数线属性设置 箱图均值属性设置 均值使用点显示、设置点形状、填充色 均值使用线显示 、线型、颜色设置箱图中所有线属性设置

3、seaborn.boxplot分组箱图分组绘图(方法一)分组绘图(方法二)箱子颜色设置 设置箱子颜色 设置箱子颜色饱和度箱子间距设置 每个小组再按子组绘图 按顺序绘制箱图


正文开始啦

一个箱图的主要组成原件

线图用来展现数据的分布,能直观的展示数据的关键指标(如下四分位数、上四分位数、中位数、最大值、最小值、离散点/异常值点);箱线图可直观展示不同组数据的差异;下面详细介绍python中matplotlib及seaborn库绘制箱图。

1、数据集准备及箱图简介

还是使用鸢尾花数据集iris,iris详细介绍请戳:Python可视化|matplotlib10-绘制散点图scatter

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import seaborn as sns
import palettable
from sklearn import datasets 


plt.rcParams['font.sans-serif']=['SimHei']  # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于显示中文

iris=datasets.load_iris()
x, y = iris.data, iris.target
pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),columns=['sepal length(cm)','sepal width(cm)','petal length(cm)','petal width(cm)','class'] )

查看数据集样子? pd_iris["sepal width(cm)"]简单统计,后文主要使用该列数据集绘图

pd_iris["sepal width(cm)"].describe()#以上各个值其实都可以使用describe函数查看

count    150.000000
mean       3.054000
std        0.433594
min        2.000000
25%        2.800000(下四分位数,25% 的数据小于等于此值。)
50%        3.000000(中位数,50% 的数据小于等于此值。)
75%        3.300000(上四分位数,75% 的数据小于等于此值。)
max        4.400000
Name: sepal width(cm), dtype: float64

上面注释部分很好的解释了下面箱图中四分位数的含义  


2、seaborn.boxplot箱图外观设置

  • 默认参数绘制箱图

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],#传入一组数据
            orient='v'#箱子垂直显示,默认为'h'水平显示
           )
plt.show()
  • 箱图异常值属性设置

异常值关闭显示

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            showfliers=False,#异常值关闭显示
           )
plt.show()

异常值marker大小设置

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            orient='v',
            fliersize=15,#设置离散值marker大小,默认为5
           )
plt.show()

异常值marker形状、填充色、轮廓设置

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            orient='v',
            flierprops = {'marker':'o',#异常值形状
                          'markerfacecolor':'red',#形状填充色
                          'color':'black',#形状外廓颜色
                         },
           )
plt.show()
  • 箱图上下横线属性设置

上下横线关闭

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            showcaps=False,#上下横线关闭
           )
plt.show()

上下横线颜色、线型、线宽等设置

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            capprops={'linestyle':'--','color':'red'},#设置上下横线属性
           )
plt.show()
  • 箱图上下须线属性设置

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            whiskerprops={'linestyle':'--','color':'red'},#设置上下须属性
           )
plt.show()
  • 箱图箱子设置

箱子设置缺口

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            orient='v',
            notch=True,#箱子设置缺口
           )
plt.show()

箱子不填充颜色

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            orient='v',
            color='white',#箱子不填充
           )
plt.show()

箱子外框、内部填充色

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
           boxprops = {'color':'red',#箱子外框
           'facecolor':'pink'#箱子填充色
           },#设置箱子属性
           )
plt.show()
  • 箱图中位数线属性设置

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
           medianprops = {'linestyle':'--','color':'red'},#设置中位数线线型及颜色
           )
plt.show()
  • **箱图均值属性设置 **

均值使用点显示、设置点形状、填充色

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            showmeans=True,#箱图显示均值,
            meanprops = {'marker':'D','markerfacecolor':'red'},#设置均值属性
           )
plt.show()

均值使用线显示 、线型、颜色设置

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            showmeans=True,#箱图显示均值,
            meanline=True,#显示均值线
            meanprops = {'linestyle':'--','color':'red'},#设置均值线属性
           )
plt.show()
  • 箱图中所有线属性设置

plt.figure(dpi=100)
sns.boxplot(y=pd_iris["sepal width(cm)"],
            orient='v',
            linewidth=8#设置箱子等线的宽度
           )
plt.show()

3、seaborn.boxplot分组箱图

  • 分组绘图(方法一)

plt.figure(dpi=100)
class_name=[iris.target_names[0] if i==0.0 else iris.target_names[1] if i==1.0 else iris.target_names[2] for i in pd_iris['class']]
sns.boxplot(x=class_name,#按照pd_iris["sepal width(cm)"]分组,即按照每种鸢尾花('setosa', 'versicolor', 'virginica')分组绘图
            y=pd_iris["sepal width(cm)"],#绘图数据
            orient='v'
           )
plt.show()
  • 分组绘图(方法二)

plt.figure(dpi=100)
sns.boxplot(x='class',
            y='sepal width(cm)',
            data=pd_iris,#data的作用就是x,y每次不需要输入pd_iris
            orient='v'
           )
plt.show()
  • 箱子颜色设置

设置箱子颜色

import palettable
plt.figure(dpi=100)
sns.boxplot(x='class',
            y='sepal width(cm)',
            data=pd_iris,
            orient='v',
            palette=palettable.tableau.TrafficLight_9.mpl_colors,#设置每个箱子颜色
           )
plt.show()

设置箱子颜色饱和度

import palettable
plt.figure(dpi=100)
sns.boxplot(x='class',
            y='sepal width(cm)',
            data=pd_iris,
            orient='v',
            palette=palettable.tableau.TrafficLight_9.mpl_colors,
            saturation=0.3,#设置颜色饱和度
           )
plt.show()
  • 箱子间距设置

import palettable
plt.figure(dpi=100)
sns.boxplot(x='class',
            y='sepal width(cm)',
            data=pd_iris,
            orient='v',
            palette=palettable.tableau.TrafficLight_9.mpl_colors,
            saturation=0.3,#设置颜色饱和度
            width=1.0,#设置箱子之间距离,为1时,每个箱子之间距离为0
           )
plt.show()
  • 每个小组再按子组绘图

plt.figure(dpi=100)
class_name=[iris.target_names[0] if i==0.0 else iris.target_names[1] if i==1.0 else iris.target_names[2] for i in pd_iris['class']]
sns.boxplot(x=class_name,
            y=pd_iris['sepal width(cm)'],
            hue=pd_iris['petal width(cm)'],#每类按照子类分组:上图三类再按照'sepal width(cm)'分组绘图
            orient='v'
           )
plt.show()
  • 按顺序绘制箱图

plt.figure(dpi=100)
class_name=[iris.target_names[0] if i==0.0 else iris.target_names[1] if i==1.0 else iris.target_names[2] for i in pd_iris['class']]
sns.boxplot(x=class_name,
            y=pd_iris["sepal width(cm)"],
            hue=pd_iris['petal width(cm)'],
            order=["virginica", "versicolor", "setosa"],#设置箱子的显示顺序
            hue_order=sorted(list(pd_iris['petal width(cm)'].unique())),#设置每个子类中箱子的显示顺序,此处设置从小到大排序
            orient='v'
           )
plt.show()

4、参考资料

同系列文章

Python可视化matplotlib&seborn14-热图heatmap
Python可视化matplotlib&seborn15-聚类热图clustermap
Python可视化matplotlib&seborn16-相关性heatmap


原创不易"点赞"、"在看"鼓励下呗

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存